home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / sword.lzh / enemy.c next >
C/C++ Source or Header  |  1999-06-03  |  5KB  |  253 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <XSP2lib.H>
  5. #include "main.h"
  6. #include "enemy.h"
  7. #include "fxsp2lib.h"
  8. #include "parts.h"
  9.  
  10.  
  11. #define ENEMY_MAX    64    /* 最大数 */
  12.  
  13. static ENEMY enemy[ENEMY_MAX];    /* ワーク */
  14. static ENEMY *enemy_top,    /* 使用中のワークのリスト */
  15.  *enemy_null_top,        /* 空のワークのリスト */
  16.  *enemy_end;            /* 使用中ワークのリストの末尾 */
  17.  
  18.  
  19. extern char end_of_data;
  20. extern char f_option_flag;
  21.  
  22. typedef struct _spwork {
  23.     signed short x, y;    /* 座標 */
  24.     unsigned short pt;    /* スプライトパターンNo. */
  25.     unsigned short info;    /* 反転コード・色・優先度を表わすデータ */
  26. } SPWORK;
  27.  
  28.  
  29.  
  30.  
  31. int EnemyInit0 (void)
  32. {
  33.     int i;
  34.  
  35.     /* リストをつなげる */
  36.     enemy_top = NULL;
  37.     enemy_end = NULL;
  38.     enemy_null_top = enemy;
  39.     for (i = 0; i < ENEMY_MAX; i++)
  40.         enemy[i].next = &enemy[i + 1];
  41.  
  42.     enemy[ENEMY_MAX - 1].next = NULL;
  43.  
  44.     return (0);
  45. }
  46.  
  47.  
  48.  
  49. void EnemyInit (unsigned short type, unsigned short info,
  50.         signed short ox, signed short oy, ENEMY * parent)
  51. {
  52.     ENEMY *p;
  53.  
  54.     if (enemy_null_top == NULL) {
  55.         printf ("ワークが一杯です\n");
  56.         return;        /* 空きのワークがない(キャラクターオーバー) */
  57.     }
  58.     /* リストの末尾に新しいノードを追加 */
  59.     p = enemy_null_top;
  60.     enemy_null_top = p->next;
  61.     if (enemy_top == NULL)
  62.         enemy_top = p;
  63.     else
  64.         enemy_end->next = p;
  65.     p->next = NULL;
  66.     enemy_end = p;
  67.  
  68.     p->type = type;
  69.     p->info = info;
  70.     p->ox = ox;
  71.     p->oy = oy;
  72.     p->x = p->y = 0;
  73.     p->parent = parent;
  74.  
  75.     p->lx = p->ly = p->lz = 0.0;
  76.     p->vx = p->vy = p->vz = 0.0;
  77.     p->cyc = 0;
  78.     p->cyc1 = 0;
  79.     p->round = p->round_v = p->spring = p->spring_v = 0.0;
  80.     switch (type) {
  81.     case 1:
  82.     case 2:
  83.         p->round = M_PI / 2.0;
  84.         break;
  85.     }
  86. }
  87.  
  88.  
  89.  
  90. /* 複数のスプライトで構成されているパーツ1個分のスプライトをまとめて表示 */
  91. static void DispSp (ENEMY * p, short sp_num, PARTS_TABLE * parts_table)
  92. {
  93.     short h;
  94.     SPWORK spwork;
  95.  
  96.     for (h = 0; h < sp_num; h++) {
  97.         p->x = p->lx + p->ox;
  98.         p->y = p->ly + p->oy;
  99.         if (p->parent != NULL) {
  100.             spwork.x = p->x + p->parent->x + parts_table[h].x;
  101.             spwork.y = p->y + p->parent->y + parts_table[h].y;
  102.         } else {
  103.             spwork.x = p->x + parts_table[h].x;
  104.             spwork.y = p->y + parts_table[h].y;
  105.         }
  106.         spwork.pt = parts_table[h].pt;
  107.         spwork.info = p->info;
  108.  
  109.         spwork.x += (128 + 16);    /* 表示用に補正 */
  110.         spwork.y += (128 + 16);
  111.         xsp_set_st (&spwork);
  112.         fxsp_set_st (&spwork);
  113.         spwork.x -= (128 + 16);
  114.         spwork.y -= (128 + 16);
  115.     }
  116. }
  117.  
  118.  
  119.  
  120. void EnemyMove (void)
  121. {
  122.     ENEMY *p, *q;
  123.  
  124.     p = enemy_top;
  125.     q = NULL;
  126.     while (p != NULL) {
  127.         char erase_flag = 0;
  128.  
  129.         switch (p->type) {
  130.         case 0:    /* 本体 */
  131.             DispSp (p, 18, parts0_table);
  132.             break;
  133.  
  134.         case 1:    /* 左翼 */
  135.             switch (p->cyc) {
  136. #define R1    8        /* 半径 */
  137. #define RA1    (0.04)        /* 加速度 */
  138. #define RV1_MAX (0.3)        /* 速度最大値 */
  139.             case 0:/* 回転 */
  140.                 p->round += p->round_v;
  141.                 if ((p->round_v += RA1) > RV1_MAX)
  142.                     p->round_v = RV1_MAX;
  143.                 p->lx = R1 * cos (p->round);
  144.                 p->ly = R1 * sin (p->round);
  145. #define R1_MAX (M_PI)
  146.                 if (p->round > R1_MAX) {
  147.                     p->round -= R1_MAX;
  148.                     p->cyc++;
  149.                 }
  150.                 break;
  151.             case 1:/* ばね振動 */
  152. #define SPRING_K1    0.5
  153. #define SPRING_M1    0.8    /* 摩擦計数 */
  154. #define ROUND_MIN1    0.03    /* 座標がこれ以下になれば中断 */
  155. #define ROUNDV_MIN1    0.10    /* 速度がこれ以下になれば中断 */
  156.                 p->round += p->round_v;
  157.                 p->round_v -= SPRING_K1 * p->round;
  158.                 p->round_v *= SPRING_M1;
  159.                 if ((fabs (p->round) < ROUND_MIN1) && (fabs (p->round_v) < ROUNDV_MIN1))
  160.                     p->cyc++;
  161.                 p->lx = R1 * cos (R1_MAX + p->round);
  162.                 p->ly = R1 * sin (R1_MAX + p->round);
  163.                 break;
  164.             case 2:
  165.                 p->lx = R1 * cos (R1_MAX + p->round);
  166.                 p->ly = R1 * sin (R1_MAX + p->round);
  167.                 break;
  168.             default:
  169.                 break;
  170.             }
  171.             DispSp (p, 9, parts1_table);
  172.             break;
  173.  
  174.         case 2:    /* 右翼 */
  175.             switch (p->cyc) {
  176.             case 0:/* 回転 */
  177.                 p->round += p->round_v;
  178.                 if ((p->round_v += RA1) > RV1_MAX)
  179.                     p->round_v = RV1_MAX;
  180.                 p->lx = -R1 * cos (p->round);
  181.                 p->ly = R1 * sin (p->round);
  182.                 if (p->round > R1_MAX) {
  183.                     p->round -= R1_MAX;
  184.                     p->cyc++;
  185.                 }
  186.                 break;
  187.             case 1:/* ばね振動 */
  188.                 p->round += p->round_v;
  189.                 p->round_v -= SPRING_K1 * p->round;
  190.                 p->round_v *= SPRING_M1;
  191.                 if ((fabs (p->round) < ROUND_MIN1) && (fabs (p->round_v) < ROUNDV_MIN1))
  192.                     p->cyc++;
  193.                 p->lx = -R1 * cos (R1_MAX + p->round);
  194.                 p->ly = R1 * sin (R1_MAX + p->round);
  195.                 break;
  196.             case 2:
  197.                 p->lx = -R1 * cos (R1_MAX + p->round);
  198.                 p->ly = R1 * sin (R1_MAX + p->round);
  199.                 end_of_data = !0;
  200.                 break;
  201.             default:
  202.                 break;
  203.             }
  204.             DispSp (p, 9, parts2_table);
  205.             break;
  206.  
  207.         default:
  208.             printf ("enemy_move() : バグってます\n");
  209.             break;
  210.         }
  211.  
  212.         if (erase_flag) {
  213.             if (q == NULL) {    /* リストの一番最初を削除 */
  214.                 enemy_top = p->next;
  215.                 p->next = enemy_null_top;
  216.                 enemy_null_top = p;
  217.                 q = NULL;
  218.                 p = enemy_top;
  219.             } else {
  220.                 if (p == enemy_end) {    /* リストの一番最後を削除 */
  221.                     q->next = NULL;
  222.                     enemy_end = q;
  223.                     p->next = enemy_null_top;
  224.                     enemy_null_top = p;
  225.                     p = q->next;
  226.                 } else {
  227.                     q->next = p->next;
  228.                     p->next = enemy_null_top;
  229.                     enemy_null_top = p;
  230.                     p = q->next;
  231.                 }
  232.             }
  233.         } else {
  234.             q = p;
  235.             p = p->next;
  236.         }
  237.     }
  238. }
  239.  
  240.  
  241. void EnemyTini (void)
  242. {
  243.     int i;
  244.  
  245.     /* リストをつなげる */
  246.     enemy_top = NULL;
  247.     enemy_null_top = enemy;
  248.     for (i = 0; i < ENEMY_MAX; i++)
  249.         enemy[i].next = &enemy[i + 1];
  250.  
  251.     enemy[ENEMY_MAX - 1].next = NULL;
  252. }
  253.